#include <iostream>
#include "mprpcapplication.h" //想要使用框架就得包含框架的头文件
#include "user.pb.h"
#include "mprpcchannel.h"

int main(int argc, char *argv[])
{
    // 先调用框架的初始化类且全局只调用这一次
    // MprpcApplication& myin= MprpcApplication::GetInstance();
    // myin.Init(argc,argv);它是静态函数，也就是说它和具体对象无关，可以直接通过类名调用。
    // 因为你拿到对象后并没有使用它的状态，只是用来调用静态函数。下面的方法就做到了单例懒加载，且只初始化执行一次
    MprpcApplication::Init(argc, argv);

    // 演示调用远程发布rpc的方法Login,UserServiceRpc_Stub是专门用来协助rpc客户端的
    fixbug::UserServiceRpc_Stub stub(new MprpcChannel()); // 生成一个代理对象,以后通过stub来调用rpc方法

    // rpc方法的请求参数
    fixbug::LoginRequest request; // 用户端发起调用，request肯定是这边给
    request.set_name("zhangsan");
    request.set_pwd("123456");

    // rpc方法的响应
    fixbug::LoginResponse response;

    // 发起rpc方法的调用，下面是同步的rpc方法调用过程，即它的底层是MprpcChannel::callMethod
    stub.Login(nullptr, &request, &response, nullptr); // 集中来做rpc方法调用的参数的序列化和网络发送了

    // 走到这里表示一次rpc调用完成，读取调用的结果
    if (0 == response.result().errcode())
    {
        std::cout << "rpc login response success:" << response.success() << std::endl;
    }
    else
    {
        std::cout << "rpc login response error:" << response.result().errmsg() << std::endl;
    }

    // 演示调用远程发布的rpc方法Register
    fixbug::RegisterRequset req;
    req.set_id(2000);
    req.set_name("lisi");
    req.set_pwd("12314");

    fixbug::RegisterResponse rsp;

    // 以同步的方式发起rpc调用请求，等待返回结果
    stub.Register(nullptr, &req, &rsp, nullptr);
    if (0 == rsp.result().errcode())
    {
        std::cout << "rpc register response success:" << rsp.success() << std::endl;
    }
    else
    {
        std::cout << "rpc register response error:" << rsp.result().errmsg() << std::endl;
    }

    return 0;
}
